package com.yujiahao;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description :
 * @Author:yujiahao
 * @Date: 2023/6/23 23:42
 * @Version: 1.0
 */
public class Funcation {

    /**
     * 天干地址纪年 这是计算的一种方式，掌心推演也可以，但是和下面不一样
     *
     * @param year
     * @return
     */
    public static String whichYear(String year) {

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy");

        if (year.length() <= 0) {
            //处理日期 获取当前日期 拿到所属年的最后一个数字
            Date date = new Date();
            String thisYear = simpleDateFormat.format(date);
            Integer qian = Integer.parseInt(thisYear.substring(3));
            Integer kun = Integer.parseInt(thisYear) % 12;
            return thisYear + "年是：" + Util.getChineseEra(qian, kun);
        } else {
            Date parse = null;
            try {
                parse = simpleDateFormat.parse(year);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            String thisYear = simpleDateFormat.format(parse);
            Integer qian = Integer.parseInt(thisYear.substring(3));
            Integer kun = Integer.parseInt(thisYear) % 12;
            return thisYear + "年是：" + Util.getChineseEra(qian, kun);
        }
    }


    /**
     * 根据周岁推算生肖的方法
     *
     * @param age 年龄（必须周岁）
     * @return
     */
    public static String getShengXiao(int age) {

        //存周期数
        int[] arrNew = new int[100];

        arrNew[0] = age;

        StringBuilder str = new StringBuilder();
        for (int i = 1; i < arrNew.length; i++) {
            arrNew[i] = i * 12;

        }

        //计算逻辑

        //排序
        Util.quick(arrNew, 0, arrNew.length);
        //当前地支对应的key
        int key = Util.getShenKey(whichYear("").substring(7, 9));
        //通过获取前后的角标
        int indext = Arrays.binarySearch(arrNew, age);
        int left = age - arrNew[indext - 1];
        int right = arrNew[indext + 1] - age;
        //判断顺时针还是逆时针取地支的值
        if (left <= right) {
            //找到value对应的key - left 并作为key得到最终values
            str.append(Util.getShenVelues(key - left));
        } else if (left > right) {
            //找到value对应的key + right  并作为key得到最终values
            str.append(Util.getShenVelues(key + right));
        }
        return str.toString();
    }

    /**
     * 根据生肖和大概年纪推算准确年纪（周岁）,生肖要是准的
     *
     * @param shengxiao     生肖
     * @param indefiniteAge 大概年纪
     * @param isTrue        真实年纪是否比传入的大
     * @return
     */
    public static int getAge(String shengxiao, int indefiniteAge, boolean isTrue) {


        //今夕是何年
        String whichYear = whichYear("").substring(7, 9);
        //得到今年属相对应的角标
        int shenKey = Util.getShenKey(whichYear);
        //纠正用户输入属相
        String newShengXiao = Util.changeVelues(shengxiao);
        //获得属相对应的key
        int newKey = Util.getShenKey(newShengXiao);


        //存周期数
        int[] arrNew = new int[100];

        arrNew[0] = indefiniteAge;

        for (int i = 1; i < arrNew.length; i++) {
            arrNew[i] = i * 12;

        }
        //排序
        Util.quick(arrNew, 0, arrNew.length);
        //通过获取前后的角标
        int indext = Arrays.binarySearch(arrNew, indefiniteAge);
        //真实的年龄（周岁）
        int realAge = 0;

        if ((indefiniteAge - arrNew[indext - 1]) < (arrNew[indext + 1] - indefiniteAge) || (newKey  - shenKey) < 0 ) {
              realAge = arrNew[indext - 1] - (newKey  - shenKey);
        } else {
              realAge = arrNew[indext + 1] - (newKey  - shenKey);
        }

        //验证并纠正精确年纪
        if (isTrue == true && realAge <= indefiniteAge) {
            realAge += 12;
        }

        return realAge;

    }

}
